package com.laker.autotest.api.core;

import com.laker.autotest.api.core.auth.AuthTokenProvider;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class ServiceClientFactory {
    // 缓存，key为baseUri
    private static final Map<String, EasyOkHttpClient> CLIENT_CACHE = new ConcurrentHashMap<>();

    /**
     * 获取一个 EasyOkHttpClient 实例
     *
     * @param baseUri       https://jsonplaceholder.typicode.com
     * @param tokenProvider token提供者
     */
    public static EasyOkHttpClient getClient(String baseUri, AuthTokenProvider tokenProvider) {
        // 只按 baseUri 缓存
        return CLIENT_CACHE.computeIfAbsent(baseUri, k -> {
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY); // 控制日志输出级别
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS) // 连接超时时间，10秒
                    .readTimeout(30, TimeUnit.SECONDS)    // 读取超时时间，30秒
                    .writeTimeout(30, TimeUnit.SECONDS)   // 写入超时时间，30秒
                    .callTimeout(60, TimeUnit.SECONDS)    // 整体调用超时时间，60秒
                    .connectionPool(new ConnectionPool(6, 1, TimeUnit.MINUTES)) // 连接池配置，最大6个空闲连接，1分钟保活
                    .addInterceptor(new AuthAndBaseUriInterceptor(tokenProvider)) // 添加认证和BaseUri拦截器，自动携带token
                    .addInterceptor(logging)    // 添加日志拦截器，输出请求/响应日志
                    .retryOnConnectionFailure(true) // 连接失败自动重试
                    .followRedirects(true) // 自动跟随重定向
                    .cache(null) // 不使用本地缓存（如需缓存可自定义Cache对象）
                    .pingInterval(30, TimeUnit.SECONDS) // WebSocket心跳包间隔，30秒
                    .build();
            return new EasyOkHttpClient(okHttpClient, baseUri);
        });
    }
}